package com.black.utils.commons.display;


import com.black.utils.config.prop.AppConfig;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;


/**
 * @author ylx
 */
public class InfoFrame extends JFrame {
    public static final int WIDTH = AppConfig.getInt("window.width");
    public static final int HEIGHT = AppConfig.getInt("window.height");
    public static final Color BACKGROUND = new Color(64, 64, 64);

    private InfoFrame() {
        setTitle("加载信息");
        // 创建一个容器并设置布局
        // BorderLayout  分东南西北中布局 最多只能五个组件 会自动填充满
        setLayout(new BorderLayout());
        // 窗口尺寸和位置调整
        setLocationAndSize();
        // 默认关闭操作
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        // 初始化卡片布局和容器  卡片布局允许添加多个  但每次只展示一个
        JPanel contentPane = new JPanel(new CardLayout());
        InfoPanel instance = InfoPanel.getInstance();
        contentPane.add(instance, "info");
        InfoPanel.printInfo("加载中...");
        contentPane.setBackground(BACKGROUND);
        // 添加容器到窗口
        add(contentPane, BorderLayout.CENTER);
    }

    /**
     * 设置窗口的位置和大小。
     * 该方法通过计算屏幕尺寸来确定窗口在屏幕中的中心位置，并设置窗口的特定大小。
     */
    private void setLocationAndSize() {
        // 获取屏幕的尺寸
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        // 计算窗口在屏幕中央的 x 和 y 坐标
        int xPosition = (screenSize.width - WIDTH) >> 1;
        int yPosition = (screenSize.height - HEIGHT) >> 1;

        // 设置窗口大小，高度比预定高度高出20，以提供额外的空间
        setSize(WIDTH, HEIGHT + AppConfig.getInt("top.info.height"));

        // 设置窗口位置为计算得到的中央位置
        setLocation(xPosition, yPosition);
    }

    /**
     * 退出
     *
     * @param actionEvents 事件列表 暂时不用
     */
    public void exit(ActionEvent... actionEvents) {
        System.exit(0);
    }

    /**
     * 私有构造 类加载机制 静态内部类单例
     *
     * @return Window 唯一实例
     */
    public static InfoFrame getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private static class SingletonHolder {
        private static final InfoFrame INSTANCE = new InfoFrame();
    }
}